home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games: Greatest Hits 1996 / Amiga Games: Greatest Hits 1996.iso / archive / userbox / publicdomain / frexxed.lha / frexxed / fpl / Ispell.FPL < prev    next >
Text File  |  1996-04-02  |  13KB  |  531 lines

  1. // $Id: Ispell.FPL 1.15 1996/04/02 18:36:29 jskov Exp $
  2. // $VER: Ispell.FPL 1.4 (04.10.95) © Jesper Skov
  3.  
  4. // This file is a mess. A cleanup is badly needed. Be warned :)
  5.  
  6.  
  7. int serverUp = 0;
  8.  
  9. int activeLanguage = -1;
  10.  
  11. int gui = 0;
  12.  
  13.  
  14. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» IspellPrefs() ««
  15. void export IspellPrefs()
  16. {
  17.   PromptInfo(-1,"IspellMode preferences",-1,-1,
  18.    "ispell_bin",
  19.    "ispell_languages",
  20.    "ispell_personalDict",
  21.    "ispell_flags",
  22.    "ispell_gui"
  23.    );
  24. }
  25.  
  26. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» startIspell() ««
  27. int startIspell()
  28. {
  29.   if(!FindPort("IRexxSpell")){
  30.     string language = ReadInfo("ispell_languages");
  31.     string privDict = ReadInfo("ispell_personalDict");
  32.     int i = ReadInfo("ispell_activeLanguage");
  33.     int pos = 0;
  34.     int endPos;
  35.  
  36.     while (i){
  37.       pos = strstr(language, "|", pos)+1;
  38.       i--;
  39.     }
  40.  
  41.     endPos = strstr(language, "|", pos);
  42.     if (endPos==-1)
  43.       endPos = strlen(language);
  44.     language = substr(language, pos, endPos);
  45.  
  46.     if (strlen(privDict))
  47.       privDict = " -p"+privDict;
  48.  
  49.     System("run "+ReadInfo("ispell_bin")+ReadInfo("ispell_flags")+" -d"+language+privDict+" -r");
  50.     if(!FindPort("IRexxSpell", 10)){
  51.       ReturnStatus("Can't connect to ispell server!");
  52.       return 0;
  53.     }
  54.   }
  55.   serverUp = 1;
  56.   return 1;
  57. }
  58.  
  59. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» checkBlock() ««
  60. // Works by saving file/block to a temp file which Ispell is asked to check.
  61. // All misspelled word are found by Search() and checkWord() is called.
  62. //»»»»»»»»»»»»»»»»»»»»»»
  63. export void checkBlock(int all)
  64. {
  65.   if (startIspell()){
  66.     // check block is marked
  67.     int blockBegin = ReadInfo("block_begin_y");
  68.     int blockEnd = ReadInfo("block_end_y");
  69.     string file = "T:"+itoa(GetBufferID());
  70.     string data;
  71.     string result;
  72.  
  73.     if (all){                                // File or block?
  74.       // Check file
  75.       Save(file);
  76.       SetInfo(-1,"changes",1);
  77.     } else {
  78.       // Check block
  79.       if (ReadInfo("block_exist")){            // does block exist?
  80.         data = GetBlock();                    // save block
  81.         SaveString(file, data);
  82.       } else {
  83.         ReturnStatur("No block marked!");
  84.         return;
  85.       }
  86.     }
  87.  
  88.     result = ARexxSend("IRexxSpell", "FILECHECK "+file, 20);
  89.  
  90.     System("delete "+file);
  91.  
  92.     data = LoadString(result);
  93.     System("delete "+result);
  94.  
  95.     if (strlen(data)){                        // Any output from Ispell?
  96.       int id = New();
  97.       int org;
  98.       int result;
  99.  
  100.       if (blockBegin>blockEnd)                // Goto top-most line in block
  101.         GotoLine(blockEnd);
  102.       else
  103.         GotoLine(blockBegin);
  104.       CursorLeft();                            // Problem if line 1!
  105.  
  106.       org = GetEntryID();
  107.  
  108.       openAltBuffer();
  109.  
  110.       CurrentBuffer(id);                    // Dump data so we have 'em line wise
  111.       Output(data);
  112.       GotoLine(0);
  113.  
  114.       while (strlen(data = GetLine())){        // repeat loop while there is still words
  115.  
  116.         data = substr(data,0,strlen(data)-1); // strip return
  117.  
  118.         CurrentBuffer(org);                    // search for word
  119.         Search(data, "=fc+");
  120.  
  121.         result = checkWord();                // and get it checked
  122.  
  123.         CurrentBuffer(id);
  124.  
  125.         if (result==1)                        // User asked to QUIT
  126.           break;
  127.  
  128.         if (result==2)                        // accept for the rest of session
  129.           deleteRemaining(0);                // i.e. delete any other appearance of the word
  130.  
  131. //        if (result==3)                        // accept LOWERCASED for the rest of session
  132. //          deleteRemaining(1);                // i.e. delete any other appearance of the word lowercased
  133.  
  134.         CursorDown();                        // get to next word
  135.  
  136.  
  137.       }
  138.       Clean("Kill("+itoa(id)+");");            // kill id buffer
  139.       closeAltBuffer();
  140.       CurrentBuffer(org);
  141.       Visible(1);                            // make sure that visible is re-enabled
  142.       RedrawScreen();
  143.  
  144.     } else
  145.       ReturnStatus("No misspelled words found!");
  146.   }
  147. }
  148.  
  149. void deleteRemaining(int lower)
  150. {
  151.   string s = GetLine();
  152.   int thisLine = ReadInfo("line");
  153.  
  154. //  if (lower)
  155.     // lowecase s
  156.  
  157.   while (!Search(s,"=fc+"))
  158.     DeleteLine();
  159.  
  160.   GotoLine(thisLine);
  161. }
  162.  
  163.  
  164. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» checkWord() ««
  165. export int checkWord()
  166. {
  167.   int operation = 0;
  168.  
  169.   if(startIspell()){
  170.     int retry = 1;
  171.     string word = GetWord();
  172.     string lword;
  173.  
  174.     if (!strlen(word))                        // Try previous pos if empty
  175.       word = GetWord(-1,ReadInfo("byte_position")-1);
  176.  
  177.     while(retry){
  178.       retry = 0;
  179.  
  180.       if (!strlen(word))
  181.         ReturnStatus("No word to check!?!");
  182.       else {
  183.         string result = ARexxSend("IRexxSpell", sprintf("CHECK %s",word),10);
  184.  
  185.         if(!strncmp(result, "*", 1)){
  186.           // Perfect match
  187.           ReturnStatus(sprintf("\"%s\" is correct",word));
  188.           return;
  189.         } else if (!strncmp(result, "+", 1)){
  190.           // Match because of root...
  191.           ReturnStatus(sprintf("\"%s\" is correct because of root %s", word, substr(result,2,-1)));
  192.           return;
  193.         } else {
  194.           // Let's get some alternatives...
  195.           int wait = 1;
  196.           int help = 1;
  197.           string key;
  198.           string repWord;
  199.  
  200.           int cancel=0, replace=0, add=0, accept=0, addUncased=0;
  201.  
  202.           int prevPos = ReadInfo("byte_position");
  203.  
  204.           Visible(0);
  205.  
  206.           if ((ReadInfo("column")!=1)&&Isword(GetChar(ReadInfo("byte_position")-1)))
  207.             CursorLeftWord();
  208.           BlockMark(2, ReadInfo("column"), ReadInfo("line"), ReadInfo("column")+strlen(word), ReadInfo("line"));
  209.           GotoLine(ReadInfo("line"),prevPos);
  210.  
  211.           openAltBuffer();
  212.  
  213.           Output(word);                        // Get word lower cased
  214.           retry = BlockChange(altBuf);
  215.           DownCase(0);
  216.           lword = GetLine();
  217.           DeleteLine();
  218.           BlockChange(retry);
  219.           retry = 0;
  220.  
  221.           if (gui){
  222.             int endCol = 1;
  223.             int startCol = strstr(result, ":", 0)+2;// alts start after :_
  224.             int length;
  225.             int bufCol=0;
  226.             int count=0;
  227.             char canLeft = ' ';
  228.             int resLen = strlen(result);
  229.             string array[1];
  230.  
  231.             Visible(1);
  232.             RedrawScreen();
  233.               while (endCol != resLen){
  234.                 endCol = strstr(result, ",", startCol);
  235.                 if (endCol < 0)
  236.                   endCol = strlen(result);
  237.                 length = endCol-startCol;
  238.                 resize array[count+1];
  239.                 array[count]=substr(result, startCol, length);
  240.                 startCol = endCol + 2;
  241.                 bufCol += length+5;
  242.                 count++;
  243.               }
  244.  
  245.               {
  246.                 int quit = 0;
  247.                 string arrstr=word;
  248.  
  249.                 replace = 1;
  250.                 if (RequestWindow("ISpell",
  251.                     "@replace word", "b", &replace,
  252.                     "@accept", "b", &accept,
  253.                     "@insert word", "b", &add,
  254.                     "insert @uncased", "b", &addUncased,
  255.                     "@quit", "b", &quit,
  256.                     "'"+word+"'", "A", &array, &arrstr,  -1)){
  257.  
  258.                   if (quit){
  259.                     cancel = 1;
  260.                     operation = 1;                // QUIT
  261.                   } else if (replace){
  262.                     CurrentBuffer(parent);
  263.                     replaceWord(word, arrstr);
  264.                     cancel = 1;                // skip code below
  265.                   }
  266.  
  267.                 } else
  268.                   cancel=1;
  269.               }
  270.  
  271.           } else {                            // GUI
  272.           if (strncmp(result, "#", 1)){        // Skip alt parsing if #
  273.             // ... if there are any!
  274.             int endCol = 1;
  275.             int startCol = strstr(result, ":", 0)+2;// alts start after :_
  276.             int length;
  277.             int bufCol=0;
  278.             int count='0';
  279.             char canLeft = ' ';
  280.             int resLen = strlen(result);
  281.  
  282.             while (endCol != resLen){
  283.               endCol = strstr(result, ",", startCol);
  284.               if (endCol < 0)
  285.                 endCol = strlen(result);
  286.               length = endCol-startCol;
  287.               if (((length+bufCol+5) > 78) || (count>('9'+1)) || canLeft==' '){
  288.                 Output(sprintf("\n%c > :",canLeft));
  289.                 canLeft = '<';
  290.                 count = '0';
  291.                 bufCol = 0;
  292.               }
  293.               Output(sprintf(" (%c) %s",count,substr(result, startCol, length)));
  294.               startCol = endCol + 2;
  295.               bufCol += length+5;
  296.               count++;
  297.             }
  298.             Output("\n");
  299.             GotoLine(ReadInfo("line")-1,2);
  300.             Delete();
  301.             Output(" ");
  302.           } else
  303.             Output("\n    :\n");            // There were no suggestions
  304.  
  305.           Visible(1);
  306.           GotoLine(2);
  307.  
  308.           CurrentBuffer(parent);
  309.           // Mark word in parent!
  310.  
  311.           while (wait){                        // Main loop
  312.             if (help)
  313.               Status(altBuf, "SPC: Accept this time, [i]nsert in private dict., [a]ccept this session, ?:>>");
  314.             else
  315.               Status(altBuf, "[r]eplace word (recheck), [u]ncapitalized insert, [q]uit, ?:>>");
  316.  
  317.             key = GetKey(0);
  318.  
  319.             if (!(strcmp(key, "q") && strcmp(key,"\x07") && strcmp(key, "\x1b"))){    // ESC or C-g
  320.               wait = 0;
  321.               cancel = 1;
  322.               operation = 1;                // QUIT
  323.             }
  324.  
  325.             if (!(strcmp(key, " "))){        // Space - accept this once
  326.               cancel = 1;
  327.               wait = 0;
  328.             }
  329.  
  330.             if (!strcmp(key, "?"))            // Check for help (?)
  331.               help = !help;
  332.  
  333.             if (!strcmp(key, ",")){
  334.               CurrentBuffer(altBuf);
  335.               if (GetChar(0)=='<')
  336.                 CursorUp();
  337.               CurrentBuffer(parent);
  338.             }
  339.  
  340.             if (!strcmp(key, ".")){
  341.               CurrentBuffer(altBuf);
  342.               if (GetChar(2)=='>')
  343.                 CursorDown();
  344.               CurrentBuffer(parent);
  345.             }
  346.  
  347.             if ((strcmp(key, "0")>=0) && (strcmp(key, "9")<=0)){
  348.               int offset;
  349.               int end;
  350.  
  351.               CurrentBuffer(altBuf);
  352.               offset = strstr(repWord=GetLine(),"("+key+")");
  353.               if (offset!=-1){
  354.                 wait = 0;
  355.                 cancel = 1;
  356.                 end = strstr(repWord, "(", offset+4);
  357.                 if (end == -1)
  358.                   repWord = substr(repWord, offset+4, strlen(repWord)-offset-5);
  359.                 else
  360.                   repWord = substr(repWord, offset+4, end-offset-5);
  361.  
  362.                 CurrentBuffer(parent);
  363.                 replaceWord(word, repWord);
  364.               } else
  365.                 CurrentBuffer(parent);
  366.             }
  367.  
  368.             if (!strcmp(key, "r")){
  369.               replace=1;
  370.               wait = 0;
  371.             }
  372.  
  373.             if (!strcmp(key, "a")){
  374.               accept=1;
  375.               wait = 0;
  376.             }
  377.  
  378.             if (!strcmp(key, "i")){
  379.               add=1;
  380.               wait = 0;
  381.             }
  382.  
  383.             if (!strcmp(key, "u")){
  384.               addUncased=1;
  385.               wait = 0;
  386.             }
  387.           }
  388.  
  389.         }                                    // End non-GUI
  390.  
  391.         if (!cancel){
  392.  
  393.  
  394.           if (replace){
  395.             int stat;
  396.  
  397.             repWord = PromptString(word, "Replace and re-check");
  398.             stat = GetErrNo();
  399.             if (strlen(repWord)){
  400.               replaceWord(word, repWord);
  401.               CursorLeft();
  402.               retry = 1;
  403.               word = repWord;
  404.             } else if (!stat){
  405.               replaceWord(word, repWord);
  406.               CursorLeft();
  407.             }
  408.           }
  409.  
  410.           if (accept){
  411.             ARexxSend("IRexxSpell", sprintf("ACCEPT %s",word),10);
  412.             operation = 2;                // ACCEPT
  413.           }
  414.  
  415.           if (add){
  416.             ARexxSend("IRexxSpell", sprintf("QUICKADD %s",word),10);
  417.             SetInfo(0,"ispell_addedWords",1);
  418.             operation = 2;                // ACCEPT
  419.           }
  420.  
  421.           if (addUncased){
  422.             ARexxSend("IRexxSpell", sprintf("QUICKADD %s",lword),10);
  423.             SetInfo(0,"ispell_addedWords",1);
  424.             operation = 3;                // ACCEPT lowercased
  425.           }
  426.         }
  427.  
  428.         closeAltBuffer();
  429.       }
  430.  
  431.       BlockMark(0);
  432.       }
  433.     }
  434.   }
  435.   return operation;
  436. }      
  437.  
  438. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» openAltBuffer() ««
  439. int altBuf;
  440. int parent;
  441. int openCount = 0;
  442.  
  443. void openAltBuffer()
  444. {
  445.   gui = ReadInfo("ispell_gui");
  446.   Visible(0);
  447.   if (!openCount){
  448.     altBuf = New();
  449.     parent = CurrentBuffer(altBuf);
  450.     Rename("*ispellAlternatives*");
  451.     if (!gui){
  452.       Activate(altBuf, 0, parent);            // make the new view 1 line tall
  453.       Activate(parent, 1, altBuf);
  454.       ResizeView(1,altBuf);
  455.     }
  456.     openCount = 1;
  457.   } else {
  458.     CurrentBuffer(altBuf);
  459.     openCount++;
  460.   }
  461. }
  462.  
  463. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» closeAltBuffer() ««
  464. void closeAltBuffer()
  465. {
  466.   openCount--;
  467.   if (!openCount){
  468.     Visible(0);
  469.     if (!gui){
  470.       RemoveView(parent);                    // will expand altBuf
  471.       Activate(parent,0,altBuf);            // replace altBuf with parent
  472.     }    
  473.     Clean("Kill("+itoa(altBuf)+");");
  474.     CurrentBuffer(parent);
  475.     Visible(1);
  476.   } else {
  477.     Visible(0);
  478.     CurrentBuffer(altBuf);
  479.     GotoLine(0);
  480.     DeleteLine(ReadInfo("lines"));
  481.     CurrentBuffer(parent);
  482.   }
  483. }
  484.  
  485. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» replaceWord() ««
  486. void replaceWord(string old, string new)
  487. {
  488.   if (Isword(GetChar(ReadInfo("byte_position")-1)))
  489.     CursorLeftWord();
  490.   Delete(strlen(old));
  491.   Output(new);
  492. }
  493.  
  494. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» shutdownIspell() ««
  495. export void shutdownIspell()
  496. {
  497.   if (serverUp){
  498.     if (ReadInfo("ispell_addedWords")){
  499.       ARexxSend("IRexxSpell", "ADD",10);    // force dictionary save
  500.       SetInfo(0,"ispell_addedWords",0);
  501.     }
  502.     ARexxSend("IRexxSpell", "exit",2);        // then kill server
  503.     serverUp = 0;
  504.   }
  505. }
  506.  
  507.  
  508. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Ispell settings ««
  509. ConstructInfo("ispell_bin","","","WGSH","",0,0,"ispell:bin/ispell");
  510. ConstructInfo("ispell_languages","","","WGSH","",0,0,"english");
  511. ConstructInfo("ispell_personalDict","","","WGSH","",0,0,"");
  512. ConstructInfo("ispell_flags","","","WGSH","",0,0,"");
  513. ConstructInfo("ispell_activeLanguage","","","LC", ReadInfo("ispell_languages"),0,0);
  514. ConstructInfo("ispell_gui","","","GWBH","",0,0,0);
  515.  
  516. ConstructInfo("ispell_addedWords","","","GBH","",0,1,0);
  517.  
  518. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Ispell menu ««
  519. MenuAdd("i", "Ispell","","", ReadInfo("Program_Menu"), -1);
  520.  MenuAdd("s", "Check Word", "checkWord();","", ReadInfo("Program_Menu"), -1);
  521.  MenuAdd("s", "Check Block", "checkBlock(0);","", ReadInfo("Program_Menu"), -1);
  522.  MenuAdd("s", "Check File", "checkBlock(1);","", ReadInfo("Program_Menu"), -1);
  523.  MenuAdd("s", "---","","", ReadInfo("Program_Menu"), -1);
  524.  MenuAdd("s", "Kill server", "shutdownIspell();","", ReadInfo("Program_Menu"), -1);
  525.  
  526. MenuAdd("s", "Ispell...", "IspellPrefs();", "", ReadInfo("menu_program_title"),ReadInfo("menu_program_item"),-1); // Add to PackageSettings
  527. MenuBuild();
  528.  
  529. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Quit Hook ««
  530. Hook("QuitAll", "shutdownIspell();", "ispell_addedWords");
  531.